5 1* {3 Resepti ympäristöystävälliselle demolle {3 --------------------------------------- Aki Laukkanen Muistatteko parin vuoden takaiset ajat, jolloin demon saaminen toimimaan omalla koneellasi oli suoranainen ihme? Tuolloin demot oli suunniteltu vain yhdelle ko- koonpanolle: A500 + 0.5MB CHIP-muistia. Jos oma kokoonpanosi poikkesi kysei- sestä, sait useimmissa tapauksissa unohtaa demon kokeilemisen. Syitä oli monia: itseään muuttava koodi, tiettyyn osoitteeseen käännetty tai tiettyä muistialuet- ta suoraan ilman varaamista osoittava koodi, osoiterekisterien ylimpien bittien käyttäminen datana, busy-looppien käyttäminen ajoitukseen, kaikenlaiset oletuk- set koneen tilasta ja nopeudesta jne. Luetteloa voisi jatkaa loputtomiin. Miten nykypäivinä? Nykyään konekokoonpanoihin on tullut vain lisää variaatiota: AGA tuli sotkemaan asioita loppuvuodesta 1992 uuden käyttöjärjestelmän ja uusien prosessorien kera. Oli luonnollista ajatella, etteivät vanhat demot toimi uusissa koneissa. Eihän silloin voitu edes varautua tuleviin muutoksiin Commodoren (R.I.P.) nihkeän po- litiikan vuoksi. Ajat muuttuivat, ja uudeksi "jokamiehen kokoonpanoksi" vakiin- tui A1200 ja ehkä jonkin verran FAST-muistia, joten demotkin alkoivat luonnolli- sesti hyödyntää em. kokoonpanoa. Mutta mihin jäivät muut koneet ja kokoonpanot? Ilmeisesti osalle koodereista ovat VGA- ja multisync-monitorit tuntemattomia. Näin ollen ei voida pitää varmana, että käytössä oleva näyttömoodi demoa käyn- nistettäessä olisi PAL High Res. Jos näyttömoodi "sattumalta" onkin joku toinen, kuten MULTISCAN tai DBLPAL, ei kone osaa tulkita copperlistiä oikein, vaan seu- rauksena on pikselien sekasotku. Oikea ratkaisu olisi ollut LoadView(NULL); WaitTOF(); WaitTOF(); -kutsusarja, jota onneksi yhä useammat kooderit ovat alka- neet käyttää. Tämä näkyy esimerkiksi verrattaessa The Party III:n ja Assembly '94:n demoja. Jälkimmäisistä huomattavasti suurempi osa toimii "systee- miystävällisemmin". Edelleen tuntematon näyttää olevan 68040-prosessori, erityisesti sen Writeback- cachet. Käytössä olevan prosessorinhan saa tietää ExecBasen AttnFlags-kentästä. Kyseisen kentän bittien merkitykset on selostettu Exec/execbase.i-tiedostossa. Kolmas skenaario toteutuu, jos onneton käyttäjä yrittää kokeilla AGA-demoa ECS/OCS-koneessa. Jotkut demot eivät testaa piirisarjaa, vaan yrittävät käyttää AGA-rekistereitä ja muita uusia ominaisuuksia - jälleen seuraa ilotulitus. Käytetyn apuprosessorisetin voi tarkistaa monella tavalla. Yksinkertainen tapa on GfxBase:n ChipRevBits0-kenttä. Mahdolliset bittiyhdistelmät on selostettu graphics/gfxbase.i- tiedostossa. On kuitenkin muistettava, että kenttä otettiin käyttöön vasta Kickstart V39:ssä. Toinen tapa on katsoa suoraan LISAID- rekiste- riä ($dff07c). Rekisteri otettiin kuitenkin käyttöön vasta ECS:ssä, joten on huolehdittava, että väylällä on joku tietty luku esim. kirjoittamalla johonkin hardware-rekisteriin. (Kiitokset tiedosta Sami Klemolalle.) Mahdolliset vaih- toehdot ovat $fc (ECS Denise), $f8 (AGA Lisa) tai viimeksi väylällä ollut luku (OCS Denise). Tietysti on myös muistettava mahdolliset tulevat apuprosessorise- tit kuten AAA ja Hombre. Toisaalta, jos prosessorina on HP PA-Risc, niin mahdol- lisista oletuksista ei liene hyötyä?-) Muitakin seikkoja on toki muistettava. Nykyisinhän ovat monet demot WB-käynnis- tettäviä, eli niillä on oma ikoni. Tällaisen ohjelman täytyy muistaa vastata WBenchMsg:een ohjelmasta poistuttaessa, jotta Workbench voi vapauttaa sen vaati- man muistin. Lisäksi olisi syytä osata disabloida käyttöjärjestelmä oikein Exe- cin Disable()-rutiinilla. PS. Artikkelin ohella olen tehnyt pienen koodinpätkän, joka tarkistaa prosesso- rin ja apurosessorit, osaa vastata WBenchMsg:hen, tallettaa vanhan Viewin ja te- kee muiden näyttötilojen käytön mahdolliseksi. Lisäksi se disabloi moniajon. Mahdolliset testien tulokset ohjelmanpätkä jättää pääohjelman tutkittavaksi. Ot- takaa huomioon, että sitä ei ole testattu eikä optimoitu mitenkään, joten se ei _varmastikaan_ ole paras tapa tehdä asiat. include "exec/types.i" include "libraries/dosextens.i" include "graphics/gfxbase.i" include "exec/libraries.i" include "exec/execbase.i" xref _LVOFindTask xref _LVOWaitPort xref _LVOForbid xref _LVOGetMsg xref _LVOReplyMsg xref _LVODisable xref _LVOEnable xref _LVOOpenLibrary xref _LVOCloseLibrary xref _LVOLoadView xref _LVOWaitTOF NOCHIPREV equ 0 SECTION CODE,code startup: movem.l d0/a0,-(sp) ; Tallennetaan d0 ja a0 move.l 4,a6 ; SysBase move.l #0,a1 jsr _LVOFindTask(a6) ; Haetaan oma prosessi ; jsr -$0126(a6) move.l d0,a4 move.l d0,process tst.l pr_CLI(a4) ; CLI? ; tst.l $ac(a4) bne.s check_aga ; jos CLI niin check_aga wb: lea pr_MsgPort(a4),a0 ; Haetaan prosessin viestiportti ; lea $5c(a4),a0 jsr _LVOWaitPort(a6) ; Odotetaan viestiä ; jsr -$0180(a6) lea pr_MsgPort(a4),a0 jsr _LVOGetMsg(a6) ; Haetaan viesti ; jsr -$0174(a6) move.l d0,wbenchmsg ; tallennetaan ohjelman tarvetta ; varten check_aga: moveq #0,d0 lea gfxname,a1 ; avataan jsr _LVOOpenLibrary(a6) ; graphics.library ; jsr -$0228(a6) move.l d0,gfxbase beq.w reply_to_wb ; jostain syystä ei saatu avattua move.l d0,a4 jsr _LVODisable(a6) ; keskeytykset pois ; jsr -$0078(a6) cmp.w #39,LIB_VERSION(a4) ; onko ChipRevBits0 määritelty ; cmp.w #39,$14(a4) bne.s no_chiprev move.b gb_ChipRevBits0(a4),chiprev ; move.b $ec(a4),chiprev bra.s check_proc no_chiprev: move.b #NOCHIPREV,chiprev ; Ei pystyta hakemaan ChipRevBits:ia check_proc: move.w AttnFlags(a6),processor ; CPU ja FPU ; move.w $128(a6),processor clear_view: move.l gfxbase,a6 move.l gb_ActiView(a6),oldview ; nykyinen View talteen ; move.l $22(a6),oldview move.l #0,a1 ; NULL View tilalle jsr _LVOLoadView(a6) ; jsr -$00de(a6) jsr _LVOWaitTOF(a6) ; jsr -$010e(a6) jsr _LVOWaitTOF(a6) move.l 4,a6 ; SysBase valmiiksi movem.l (sp)+,d0/a0 ; d0/a0 pois pinosta bsr.s _main ; hypätään pääohjelmaan move.l d0,-(sp) ; palautuskoodi turvaan old_view: move.l gfxbase,a6 move.l oldview,a1 ; vanha View jsr _LVOLoadView(a6) ; jsr -$00de(a6) move.l 4,a6 ; jsr -$007e(a6) jsr _LVOEnable(a6) ; keskeytykset päälle move.l a6,a1 ; suljetaan graphics.library jsr _LVOCloseLibrary(a6) ; jsr -$019e(a6) reply_to_wb: tst.l wbenchmsg ; onko workbench beq.s exit ; jos ei niin exit jsr _LVOForbid(a6) ; huomaa ettei tarvitse Permit() ; jsr -$0084(a6) move.l wbenchmsg,a1 jsr _LVOReplyMsg(a6) ; jsr -$017a(a6) exit: move.l (sp)+,d0 rts ; poistutaan ohjelmasta _main: moveq #0,d0 ; palautuskoodi rts ; pääohjelma SECTION DATA,data wbenchmsg dc.l 0 oldview dc.l 0 process dc.l 0 gfxbase dc.l 0 processor dc.w 0 ; AFB_68010 equ 0 ; AFB_68020 equ 1 ; AFB_68030 equ 2 ; AFB_68040 equ 3 ; AFB_68881 equ 4 ; AFB_68882 equ 5 ; AFB_FPU40 equ 6 ; AFB_68060 equ 7 chiprev dc.b 0 ; GFXB_BIG_BLITS equ 0 ; GFXB_HR_AGNUS equ 0 ; GFXB_HR_DENISE equ 1 ; GFXB_AA_ALICE equ 2 ; GFXB_AA_LISA equ 3 gfxname dc.b 'graphics.library',0 end